package com.zc.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

/**
 * @description:
 * @author: cong
 * @create: 2025/3/12
 */
@Slf4j
public class MyWebSocketHandler extends TextWebSocketHandler {
    /**
     * 在WebSocket连接建立后执行的方法
     *
     * @param session WebSocket会话对象，包含连接信息和状态
     * @throws Exception 如果处理过程中发生错误
     *
     * 该方法主要用于在WebSocket连接成功建立之后进行日志记录
     * 它记录了连接的唯一标识符，以便于跟踪和监控连接状态
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("afterConnectionEstablished: {}", session.getId());
    }

    /**
     * 处理接收到的文本消息
     * 当WebSocket会话中接收到文本消息时，这个方法会被调用
     * 它的功能是读取消息内容，并发送一个回复消息回客户端
     *
     * @param session 代表与客户端的WebSocket会话
     * @param message 接收到的文本消息，包含消息内容等信息
     * @throws Exception 如果在处理消息或发送消息过程中遇到错误，将抛出此异常
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 记录接收到的消息内容，便于调试和监控
        log.info("handleTextMessage: {}", message.getPayload());
        // 构造回复消息，将接收到的消息内容前加上"Hello, "后发送回客户端
        session.sendMessage(new TextMessage("Hello, " + message.getPayload()));
    }

    /**
     * 当WebSocket连接关闭时调用的方法
     *
     * @param session WebSocket会话对象，包含与客户端的连接信息
     * @param status  连接关闭的状态信息，包括关闭的原因和代码
     *
     * 此方法用于处理连接关闭后的清理或日志记录工作
     * 它接收两个参数：一个是具体的会话对象，另一个是关闭状态对象
     * 该方法实现的主要目的是记录连接关闭的信息，以便于调试或审计
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 记录连接关闭的日志信息
        log.info("afterConnectionClosed: {}", session.getId());
    }
}
